package com.ssy.lingxi.member.merchant.model.constant;

import com.ssy.lingxi.common.language.LanguageHolder;
import com.ssy.lingxi.member.merchant.model.vo.basic.response.DropdownItem;

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;


/**
 * （商户、渠道）会员关系内部状态枚举
 * @author 万宁
 * @version 2.0.0
 * @date 2021-05-29
 */
public enum MemberInnerStatusEnum {

    /**
     * 新增下级会员时的初始状态 - 0
     */
    NEW(0, "新创建或新增下级会员", 0),

    /**
     * 待审核入库资料 - 1
     */
    TO_VERIFY_DEPOSITORY_DETAIL(1, "待审核入库资料", 1),

    /**
     * 入库资料审核不通过 - 2
     */
    DEPOSITORY_DETAIL_NOT_PASSED(2, "入库资料审核不通过", 7),

    /**
     * 待审核入库资质 - 3
     */
    TO_VERIFY_DEPOSITORY_QUALIFICATION(3, "待审核入库资质", 2),

    /**
     * 入库资质审核不通过 - 4
     */
    DEPOSITORY_QUALIFICATION_NOT_PASSED(4, "入库资质审核不通过", 7),

    /**
     * 待入库考察 - 5
     */
    TO_INSPECT_DEPOSITORY(5, "待入库考察",3),

    /**
     * 入库考察不通过 - 6
     */
    DEPOSITORY_INSPECTION_NOT_PASSED(6, "入库考察不通过",7),

    /**
     * 待入库分类 - 7
     */
    TO_CLASSIFY_DEPOSITORY(7, "待入库分类",4),

    /**
     * 入库分类不通过 - 8
     */
    DEPOSITORY_CLASSIFICATION_NOT_PASSED(8, "入库分类不通过",7),

    /**
     * 待审核入库(一级) - 9
     */
    TO_DEPOSIT_GRADE_ONE(9, "待审核入库(一级)",5),

    /**
     * 入库审核不通过(一级) - 10
     */
    DEPOSITORY_GRADE_ONE_NOT_PASSED(10, "入库审核不通过(一级)",7),

    /**
     * 待审核入库(二级) - 11
     */
    TO_DEPOSIT_GRADE_TWO(11, "待审核入库(二级)",6),

    /**
     * 入库审核不通过(二级) - 12
     */
    DEPOSITORY_GRADE_TWO_NOT_PASSED(12, "入库审核不通过(二级)",7),

    /**
     * 待确认入库 - 13
     */
    TO_CONFIRM_DEPOSITORY(13, "待确认入库",7),

    /**
     * 审核通过 - 14
     */
    VERIFY_PASSED(14, "会员入库审核通过",0),

    /**
     * 审核不通过 - 15
     */
    VERIFY_NOT_PASSED(15, "会员入库审核不通过",0),

    /**
     * 待审核会员变更(一级) - 16
     */
    TO_MODIFY_GRADE_ONE(16, "待审核会员变更(一级)",1),

    /**
     * 会员变更审核不通过(一级) - 17
     */
    MODIFY_GRADE_ONE_NOT_PASSED(17, "会员变更审核不通过(一级)",3),

    /**
     * 待审核会员变更(二级) - 18
     */
    TO_MODIFY_GRADE_TWO(18, "待审核会员变更(二级)",2),

    /**
     * 会员变更审核不通过(二级) - 19
     */
    MODIFY_GRADE_TWO_NOT_PASSED(19, "会员变更审核不通过(二级)",3),

    /**
     * 待确认会员变更 - 20
     */
    TO_CONFIRM_MODIFY(20, "待确认会员变更",3),

    /**
     *会员变更审核通过 - 21
     */
    MODIFY_PASSED(21,"会员变更审核通过",0),

    /**
     * 会员变更审核不通过 - 22
     */
    MODIFY_NOT_PASSED(22, "会员变更审核不通过",0);

    private final Integer code;

    /**
     * 向报表服务发送的状态
     */
    private Integer reportTypeCode;

    MemberInnerStatusEnum(Integer code, String msg, Integer reportTypeCode) {
        this.code = code;
        this.reportTypeCode = reportTypeCode;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return LanguageHolder.getName(this.getClass(), this.getCode());
    }

    public Integer getReportTypeCode() {
        return reportTypeCode;
    }

    public static String getCodeMsg(Integer code) {
        return LanguageHolder.getName(MemberInnerStatusEnum.class, code);
    }

    public static List<Integer> toList() {
        return Arrays.stream(MemberInnerStatusEnum.values()).filter(value -> !value.getCode().equals(0)).map(MemberInnerStatusEnum::getCode).collect(Collectors.toList());
    }

    public static MemberInnerStatusEnum parse(Integer code) {
        return code == null ? null : Arrays.stream(MemberInnerStatusEnum.values()).filter(e -> e.getCode().equals(code)).findFirst().orElse(null);
    }

    public static List<DropdownItem> toDropdownItems() {
        return Arrays.stream(MemberInnerStatusEnum.values()).filter(e -> !e.getCode().equals(0)).sorted(Comparator.comparingInt(MemberInnerStatusEnum::getCode)).map(e -> new DropdownItem(e.getCode(), e.getMsg())).collect(Collectors.toList());
    }
}
